// udp_server.hpp
#include "udp_server.hpp"
#include <ctype.h>
#include <stdio.h>
#include <memory>

// 首次测试时所用
string transform(const string &str)
{
    string ret;
    for (auto e : str)
    {
        if (islower(e))
        {
            char c = toupper(e);
            ret.push_back(c);
        }
        else
        {
            ret.push_back(e);
        }
    }
    return ret;
}

// 防止出现rm这种对从操作系统造成毁灭性打击的命令
bool SafeProtect(const string &str)
{
    auto ret = str.find("rm");
    if (string::npos != ret)
    {
        return false;
    }
    ret = str.find("kill");
    if (string::npos != ret)
    {
        return false;
    }
    ret = str.find("while");
    if (string::npos != ret)
    {
        return false;
    }
    ret = str.find("mv");
    if (string::npos != ret)
    {
        return false;
    }

    return true;
}

// 业务处理->让服务器来执行客户端的命令并且返回内容
string command(const string &str)
{
    if (!SafeProtect(str))
    {
        // 保证安全
        return string("You are a bad man!!!\n");
    }

    char buff[2048];
    FILE *fp = popen(str.c_str(), "r");
    // popen：
    // 1.创建管道
    // 2.创建子进程
    // 3.通过FILE*将结果直接返回，可以让用户以读取文件的方式访问，获得命令执行结果
    string result;
    // 循环从文件中读取
    while (fgets(buff, sizeof(buff), fp) != NULL)
    {
        result += buff;
    }
    pclose(fp);
    return result;
}

// 输入错误时提示方法
void UseMessage(const string &proc)
{
    cout << "Method of use:";
    cout << proc << " serverip" << endl;
}

int main(int argc, char *argv[])
{

    if (argc != 2)
    {
        // 保证命令行运行服务器时不会有问题
        UseMessage(argv[0]);
        exit(USAGE_ERR);
    }
    int port = stoi(string(argv[1]));
    unique_ptr<Server> server(new Server(command, port));
    // s.Init(transform,ret);
    // 初始化服务器
    server->Init();
    // 运行服务器
    server->Start();

    return 0;
}
